home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 11 / CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso / cucd / programming / oberonv4 / source / system / draw.mod (.txt) < prev    next >
Oberon Text  |  1996-03-26  |  10KB  |  267 lines

  1. Syntax10.Scn.Fnt
  2. MODULE Draw; (*NW 29.6.88 / 22.11.91*)
  3.     IMPORT Files, Fonts, Viewers, Printer, Texts, Oberon,
  4.         TextFrames, MenuViewers, Graphics, GraphicFrames;
  5.     VAR W: Texts.Writer;
  6.     PROCEDURE Open*;
  7.         VAR X, Y: INTEGER;
  8.             beg, end, t: LONGINT;
  9.             G: Graphics.Graph;
  10.             F: GraphicFrames.Frame;
  11.             V: Viewers.Viewer;
  12.             text: Texts.Text;
  13.             S: Texts.Scanner;
  14.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  15.         IF (S.class = Texts.Char) & (S.c = "^") THEN
  16.             Oberon.GetSelection(text, beg, end, t);
  17.             IF t >= 0 THEN Texts.OpenScanner(S, text, beg); Texts.Scan(S) END
  18.         END ;
  19.         IF S.class = Texts.Name THEN
  20.             NEW(G); Graphics.Open(G, S.s);
  21.             NEW(F); GraphicFrames.Open(F, G, -1, 0, 0, TRUE);
  22.             Oberon.AllocateUserViewer(Oberon.Par.vwr.X, X, Y);
  23.             V := MenuViewers.New(
  24.                 TextFrames.NewMenu(S.s, "System.Close  System.Copy  System.Grow  Draw.Delete  Draw.Store"),
  25.                 F, TextFrames.menuH, X, Y)
  26.         END
  27.     END Open;
  28.     PROCEDURE Delete*;
  29.         VAR F: GraphicFrames.Frame;
  30.     BEGIN
  31.         IF Oberon.Par.frame = Oberon.Par.vwr.dsc THEN
  32.             F := Oberon.Par.vwr.dsc.next(GraphicFrames.Frame);
  33.             GraphicFrames.Erase(F); Graphics.Delete(F.graph)
  34.         END
  35.     END Delete;
  36.     PROCEDURE SetWidth*;
  37.         VAR S: Texts.Scanner;
  38.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  39.         IF (S.class = Texts.Int) & (S.i > 0) & (S.i < 7) THEN Graphics.width := SHORT(S.i) END
  40.     END SetWidth;
  41.     PROCEDURE ChangeColor*;
  42.         VAR ch: CHAR;
  43.             CM: Graphics.ColorMsg;
  44.             S: Texts.Scanner;
  45.     BEGIN
  46.         IF Oberon.Par.frame(TextFrames.Frame).hasSel THEN
  47.             Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.frame(TextFrames.Frame).selbeg.pos);
  48.             Texts.Read(S, ch); CM.col := S.col
  49.         ELSE Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  50.             IF S.class = Texts.Int THEN CM.col := SHORT(S.i) ELSE CM.col := S.col END
  51.         END ;
  52.         GraphicFrames.Change(GraphicFrames.Selected(), CM)
  53.     END ChangeColor;
  54.     PROCEDURE ChangeWidth*;
  55.         VAR WM: Graphics.WidMsg;
  56.             S: Texts.Scanner;
  57.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  58.         IF S.class = Texts.Int THEN
  59.             WM.w := SHORT(S.i); GraphicFrames.Change(GraphicFrames.Selected(), WM)
  60.         END
  61.     END ChangeWidth;
  62.     PROCEDURE ChangeFont*;
  63.         VAR FM: Graphics.FontMsg;
  64.             S: Texts.Scanner;
  65.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  66.         IF S.class = Texts.Name THEN
  67.             FM.fnt := Fonts.This(S.s);
  68.             IF FM.fnt # NIL THEN GraphicFrames.Change(GraphicFrames.Selected(), FM) END
  69.         END
  70.     END ChangeFont;
  71.     PROCEDURE ChangeBackgroundColor*;
  72.         VAR ch: CHAR; v: Viewers.Viewer;
  73.             R: Texts.Reader;
  74.             F: TextFrames.Frame; G: GraphicFrames.Frame;
  75.     BEGIN v := Oberon.MarkedViewer();
  76.         IF (v.dsc # NIL) & (v.dsc.next IS GraphicFrames.Frame) THEN
  77.             G := v.dsc.next(GraphicFrames.Frame); F := Oberon.Par.frame(TextFrames.Frame);
  78.             IF F.hasSel THEN
  79.                 Texts.OpenReader(R, Oberon.Par.text, F.selbeg.pos); Texts.Read(R, ch);
  80.                 G.col := R.col; GraphicFrames.Restore(G)
  81.             END
  82.         END
  83.     END ChangeBackgroundColor;
  84.     PROCEDURE ToggleTicks*;
  85.         VAR v: Viewers.Viewer; G: GraphicFrames.Frame;
  86.     BEGIN v := Oberon.MarkedViewer();
  87.         IF (v.dsc # NIL) & (v.dsc.next IS GraphicFrames.Frame) THEN
  88.             G := v.dsc.next(GraphicFrames.Frame); G.ticked := ~G.ticked; GraphicFrames.Restore(G)
  89.         END
  90.     END ToggleTicks;
  91.     PROCEDURE Backup (VAR name: ARRAY OF CHAR);
  92.         VAR res, i: INTEGER; ch: CHAR;
  93.             bak: ARRAY 32 OF CHAR;
  94.     BEGIN i := 0; ch := name[0];
  95.         WHILE ch > 0X DO bak[i] := ch; INC(i); ch := name[i] END ;
  96.         IF i < 28 THEN
  97.             bak[i] := "."; bak[i+1] := "B"; bak[i+2] := "a"; bak[i+3] := "k"; bak[i+4] := 0X;
  98.             Files.Rename(name, bak, res)
  99.         END
  100.     END Backup;
  101.     PROCEDURE Store*;
  102.         VAR par: Oberon.ParList; S: Texts.Scanner;
  103.             Menu: TextFrames.Frame; G: GraphicFrames.Frame;
  104.             v: Viewers.Viewer;
  105.     BEGIN par := Oberon.Par;
  106.         IF par.frame = par.vwr. dsc THEN
  107.             Menu := par.vwr.dsc(TextFrames.Frame); G := Menu.next(GraphicFrames.Frame);
  108.             Texts.OpenScanner(S, Menu.text, 0); Texts.Scan(S);
  109.             IF S.class = Texts.Name THEN
  110.                 Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
  111.                 Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
  112.                 Backup(S.s); Graphics.WriteFile(G.graph, S.s)
  113.             END
  114.         ELSE
  115.             Texts.OpenScanner(S, par.text, par.pos); Texts.Scan(S);
  116.             IF S.class = Texts.Name THEN
  117.                 v := Oberon.MarkedViewer();
  118.                 IF (v.dsc # NIL) & (v.dsc.next IS GraphicFrames.Frame) THEN
  119.                     G := v.dsc.next(GraphicFrames.Frame);
  120.                     Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
  121.                     Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
  122.                     Backup(S.s); Graphics.WriteFile(G.graph, S.s)
  123.                 END
  124.             END
  125.         END
  126.     END Store;
  127.     PROCEDURE Print*;
  128.         VAR nofcopies: INTEGER;
  129.             S: Texts.Scanner;
  130.             G: Graphics.Graph;
  131.             V: Viewers.Viewer;
  132.         PROCEDURE Copies;
  133.             VAR ch: CHAR;
  134.         BEGIN nofcopies := 1;
  135.             IF S.nextCh = "/" THEN
  136.                 Texts.Read(S, ch);
  137.                 IF (ch >= "0") & (ch <= "9") THEN nofcopies := ORD(ch) - 30H END ;
  138.                 WHILE ch > " " DO Texts.Read(S, ch) END ;
  139.                 S.nextCh := ch
  140.             END
  141.         END Copies;
  142.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  143.         IF S.class = Texts.Name THEN
  144.             Printer.Open(S.s, Oberon.User, Oberon.Password);
  145.             IF Printer.res = 0 THEN
  146.                 Texts.Scan(S);
  147.                 WHILE S.class = Texts.Name DO
  148.                     Texts.WriteString(W, S.s); Copies; NEW(G); Graphics.Open(G, S.s);
  149.                     IF Graphics.res = 0 THEN
  150.                         Texts.WriteString(W, " printing");
  151.                         Texts.WriteInt(W, nofcopies, 3); Texts.Append(Oberon.Log, W.buf);
  152.                         Graphics.Print(G, 0, Printer.PageHeight-128); Printer.Page(nofcopies)
  153.                     ELSE Texts.WriteString(W, " not found")
  154.                     END ;
  155.                     Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); Texts.Scan(S)
  156.                 END ;
  157.                 IF (S.class = Texts.Char) & (S.c = "*") THEN
  158.                     Copies; V := Oberon.MarkedViewer();
  159.                     IF (V.dsc # NIL) & (V.dsc.next IS GraphicFrames.Frame) THEN
  160.                         Texts.OpenScanner(S, V.dsc(TextFrames.Frame).text, 0);
  161.                         Texts.Scan(S);
  162.                         IF S.class = Texts.Name THEN
  163.                             Texts.WriteString(W, S.s); Texts.WriteString(W, " printing");
  164.                             Texts.WriteInt(W, nofcopies, 3); Texts.Append(Oberon.Log, W.buf);
  165.                             Graphics.Print(V.dsc.next(GraphicFrames.Frame).graph, 0, Printer.PageHeight-128);
  166.                             Printer.Page(nofcopies)
  167.                         END
  168.                     END
  169.                 END ;
  170.                 Printer.Close
  171.             ELSIF Printer.res = 1 THEN Texts.WriteString(W, " no printer")
  172.             ELSIF Printer.res = 2 THEN Texts.WriteString(W, " no link")
  173.             ELSIF Printer.res = 3 THEN Texts.WriteString(W, " bad response")
  174.             ELSIF Printer.res = 4 THEN Texts.WriteString(W, " no permission")
  175.             END
  176.         END ;
  177.         Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  178.     END Print;
  179.     PROCEDURE Macro*;
  180.         VAR S: Texts.Scanner;
  181.             T: Texts.Text;
  182.             time, beg, end: LONGINT;
  183.             Lname: ARRAY 32 OF CHAR;
  184.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  185.         IF S.class = Texts.Name THEN
  186.             COPY(S.s, Lname); Texts.Scan(S);
  187.             IF (S.class = Texts.Char) & (S.c = "^") THEN
  188.                 Oberon.GetSelection(T, beg, end, time);
  189.                 IF time >= 0 THEN Texts.OpenScanner(S, T, beg); Texts.Scan(S) END
  190.             END ;
  191.             IF (S.class = Texts.Name) OR (S.class = Texts.String) THEN
  192.                 GraphicFrames.Macro(Lname, S.s)
  193.             END
  194.         END
  195.     END Macro;
  196.     PROCEDURE OpenMacro*;
  197.         VAR F: GraphicFrames.Frame; sel: Graphics.Object;
  198.     BEGIN F := GraphicFrames.Selected();
  199.         IF F # NIL THEN
  200.             sel := F.graph.sel;
  201.             IF (sel # NIL) & (sel IS Graphics.Macro) THEN
  202.                 GraphicFrames.Deselect(F);
  203.                 Graphics.OpenMac(sel(Graphics.Macro).mac, F.graph, F.mark.x - F.x, F.mark.y - F.y);
  204.                 GraphicFrames.Draw(F)
  205.             END
  206.         END
  207.     END OpenMacro;
  208.     PROCEDURE MakeMacro*;
  209.         VAR new: BOOLEAN;
  210.             F: GraphicFrames.Frame;
  211.             S: Texts.Scanner;
  212.             Lname: ARRAY 32 OF CHAR;
  213.         PROCEDURE MakeMac;
  214.             VAR x0, y0, x1, y1, w, h: INTEGER;
  215.                 mh: Graphics.MacHead;
  216.                 L: Graphics.Library;
  217.         BEGIN
  218.             L := Graphics.ThisLib(Lname, FALSE);
  219.             IF L = NIL THEN L := Graphics.NewLib(Lname) END ;
  220.             x0 := F.mark.x; y0 := F.mark.y; x1 := F.mark.next.x; y1 := F.mark.next.y;
  221.             w := ABS(x1-x0); h := ABS(y1-y0);
  222.             IF x0 < x1 THEN x0 := x0 - F.x ELSE x0 := x1 - F.x END ;
  223.             IF y0 < y1 THEN y0 := y0 - F.y ELSE y0 := y1 - F.y END ;
  224.             mh := Graphics.MakeMac(F.graph, x0, y0, w, h, S.s);
  225.             Graphics.InsertMac(mh, L, new)
  226.         END MakeMac;
  227.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  228.         IF S.class = Texts.Name THEN
  229.             COPY(S.s, Lname); Texts.Scan(S);
  230.             IF (S.class  = Texts.Name) OR (S.class = Texts.String) & (S.len <= 8) THEN
  231.                 F := GraphicFrames.Focus();
  232.                 IF (F # NIL) & (F.graph.sel # NIL) THEN
  233.                     MakeMac; Texts.WriteString(W, S.s);
  234.                     IF new THEN Texts.WriteString(W, " inserted in ")
  235.                     ELSE Texts.WriteString(W, " replaced in ")
  236.                     END ;
  237.                     Texts.WriteString(W, Lname); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  238.                 END
  239.             END
  240.         END
  241.     END MakeMacro;
  242.     PROCEDURE LoadLibrary*;
  243.         VAR S: Texts.Scanner; L: Graphics.Library;
  244.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  245.         IF S.class = Texts.Name THEN
  246.             L := Graphics.ThisLib(S.s, TRUE);
  247.             Texts.WriteString(W, S.s); Texts.WriteString(W, " loaded");
  248.             Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  249.         END
  250.     END LoadLibrary;
  251.     PROCEDURE StoreLibrary*;
  252.         VAR i: INTEGER; S: Texts.Scanner; L: Graphics.Library;
  253.             Lname: ARRAY 32 OF CHAR;
  254.     BEGIN Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos); Texts.Scan(S);
  255.         IF S.class = Texts.Name THEN i := 0;
  256.             WHILE S.s[i] >= "0" DO Lname[i] := S.s[i]; INC(i) END ;
  257.             Lname[i] := 0X; 
  258.             L := Graphics.ThisLib(Lname, FALSE);
  259.             IF L # NIL THEN
  260.                 Texts.WriteString(W, S.s); Texts.WriteString(W, " storing");
  261.                 Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); Graphics.StoreLib(L, S.s)
  262.             END
  263.         END
  264.     END StoreLibrary;
  265. BEGIN Texts.OpenWriter(W)
  266. END Draw.
  267.